// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "AbilitySystem/Abilities/LyraGameplayAbility.h"
#include "LyraGamePhaseAbility.generated.h"

/**
 * ULyraGamePhaseAbility
 * 用于改变当前游戏阶段的任何能力的基础游戏玩法能力。
 */
UCLASS(Abstract, HideCategories = Input)
class ULyraGamePhaseAbility : public ULyraGameplayAbility
{
	GENERATED_BODY()

public:

	ULyraGamePhaseAbility(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());

	/**
	 * 获取此游戏阶段能力对应的游戏阶段标签。
	 * @return 游戏阶段标签的常量引用。
	 */
	const FGameplayTag& GetGamePhaseTag() const { return GamePhaseTag; }

#if WITH_EDITOR
	/**
	 * 数据验证函数，检查此能力的数据是否有效。
	 * @param Context 数据验证上下文。
	 * @return 数据验证结果。
	 */
	virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override;
#endif

protected:

	/**
	 * 当能力被激活时调用。
	 * @param Handle 能力规格句柄。
	 * @param ActorInfo 能力拥有者的Actor信息。
	 * @param ActivationInfo 能力激活信息。
	 * @param TriggerEventData 触发能力的事件数据。
	 */
	virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;
	/**
	 * 当能力结束时调用。
	 * @param Handle 能力规格句柄。
	 * @param ActorInfo 能力拥有者的Actor信息。
	 * @param ActivationInfo 能力激活信息。
	 * @param bReplicateEndAbility 是否复制结束能力。
	 * @param bWasCancelled 能力是否被取消。
	 */
	virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled) override;

protected:

	// 定义此游戏阶段能力所属的游戏阶段。例如，如果你的游戏阶段是 GamePhase.RoundStart，那么它将取消所有同级的阶段。
	// 所以如果你有一个像 GamePhase.WaitingToStart 这样的阶段是活跃的，启动属于 RoundStart 的能力将结束 WaitingToStart。
	// 然而，为了获得嵌套行为，你也可以嵌套阶段。例如，GamePhase.Playing.NormalPlay 是父阶段 GamePhase.Playing 的一个子阶段，
	// 所以将子阶段改为 GamePhase.Playing.SuddenDeath 将停止任何绑定到 GamePhase.Playing.* 的能力，但不会结束任何绑定到 GamePhase.Playing 阶段的能力。
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Lyra|Game Phase")
	FGameplayTag GamePhaseTag; // 游戏阶段标签
};